package com.triadsystems.cashweb.modelo.negocio.dominios.impl;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.inject.Inject;
import javax.inject.Named;

import lombok.Getter;
import lombok.Setter;

import com.icon.infra.modelo.negocio.excecoes.ConsultaInvalidaException;
import com.icon.infra.modelo.negocio.excecoes.MultiplosResultadosParaRecuperarObjetoException;
import com.icon.infra.modelo.negocio.excecoes.ObjetoNaoEncontradoException;
import com.triadsystems.cashweb.modelo.negocio.dominios.ITransacaoDominio;
import com.triadsystems.cashweb.modelo.negocio.servicos.ICaixaServico;
import com.triadsystems.cashweb.modelo.negocio.servicos.IMovimentacaoServico;
import com.triadsystems.cashweb.modelo.negocio.servicos.ITransacaoServico;
import com.triadsystems.cashweb.modelo.persistencia.entidades.Caixa;
import com.triadsystems.cashweb.modelo.persistencia.entidades.Filial;
import com.triadsystems.cashweb.modelo.persistencia.entidades.Movimentacao;
import com.triadsystems.cashweb.modelo.persistencia.entidades.TransacaoPagamento;
import com.triadsystems.cashweb.modelo.persistencia.enums.TipoMovimentacaoEnum;

@Named
public class TransacaoDominio implements
		ITransacaoDominio {
	@Inject
	private IMovimentacaoServico movimentacaoServico;
	@Inject
	private ITransacaoServico transacaoServico;
	@Inject
	private ICaixaServico caixaServico;

	@Getter
	@Setter
	private List<Movimentacao> listaMovimentacao;
	@Getter
	@Setter
	private List<TransacaoPagamento> listaTransacao;

	public List<TransacaoPagamento> getTransacaoByDataFilial(
			List<Filial> filiais, Calendar inicio, Calendar fim)
			throws MultiplosResultadosParaRecuperarObjetoException,
			ObjetoNaoEncontradoException, ConsultaInvalidaException {
		listaTransacao = new ArrayList<TransacaoPagamento>();
		listaMovimentacao = new ArrayList<Movimentacao>();

		List<Caixa> lista = new ArrayList<Caixa>();
		lista = (List<Caixa>) caixaServico.getCaixabyData(inicio, fim);

		for (Filial filial : filiais) {
			for (Caixa caixa : lista) {
				if (caixa.getFilial().equals(filial)) {
					listaMovimentacao.addAll(movimentacaoServico
							.getMovimentacoesByCaixa(caixa));
				}
			}
		}

		for (Movimentacao mov : listaMovimentacao) {
			if (mov.getTipoMovimentacao().equals(
					TipoMovimentacaoEnum.RECEBIMENTO)) {
				listaTransacao.add(transacaoServico
						.getTransacaoPagamentoByMovimentacao(mov));
			}
		}

		return listaTransacao;
	}
}